# 使用 smtplib 模块发送纯文本邮件
import smtplib
import ssl
import configparser  # 导入用于读取配置文件的模块
from email.message import EmailMessage
from pathlib import Path
from typing import Optional

def send_email(subject: str, body: str, recipient: Optional[str] = None) -> bool:
    """
    发送一封纯文本邮件。

    Args:
        subject (str): 邮件标题。
        body (str): 邮件正文内容。
        recipient (Optional[str], optional): 收件人的邮箱地址。
            如果为 None，则会尝试从 config.ini 文件中读取默认收件人。
            默认为 None。

    Returns:
        bool: 发送成功返回 True，失败返回 False。
    """
    # --- 1. 读取配置文件 ---
    config = configparser.ConfigParser()
    config_file = Path(__file__).parent / 'config.ini'

    if not config_file.exists():
        print(f"错误：配置文件 '{config_file}' 不存在。")
        return False

    try:
        config.read(config_file, encoding='utf-8')
        
        EMAIL_ADDRESS = config['SMTP']['sender_email']
        EMAIL_PASSWORD = config['SMTP']['app_password']
        SMTP_SERVER = config['SMTP']['server']
        SMTP_PORT = int(config['SMTP']['port'])
        DEFAULT_RECIPIENT = config['SMTP'].get('default_recipient', None) # 使用.get避免缺少时报错
    except (KeyError, ValueError) as e:
        print(f"错误：配置文件 'config.ini' 格式不正确或缺少必要项。错误详情: {e}")
        return False

    # --- 2. 确定最终的收件人 ---
    final_recipient = recipient if recipient is not None else DEFAULT_RECIPIENT
    
    if not final_recipient:
        print("错误：未指定收件人，并且配置文件中也未设置 'default_recipient'。")
        return False

    # --- 3. 创建邮件消息对象 ---
    msg = EmailMessage()
    msg['Subject'] = subject           # 邮件标题
    msg['From'] = EMAIL_ADDRESS        # 邮件发件人
    msg['To'] = final_recipient        # 邮件收件人
    msg.set_content(body)              # 设置邮件的主体内容

    # --- 4. 连接服务器并发送邮件 ---
    context = ssl.create_default_context()
    
    try:
        print(f"正在连接到服务器 {SMTP_SERVER}:{SMTP_PORT} ...")
        with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT, context=context) as smtp:
            print("正在登录...")
            smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
            print(f"正在发送邮件给 {final_recipient} ...")
            smtp.send_message(msg)
            print("邮件发送成功！")
            return True
            
    except smtplib.SMTPAuthenticationError:
        print("错误：邮箱认证失败！请检查邮箱地址和授权码是否正确。")
    except smtplib.SMTPConnectError:
        print("错误：无法连接到SMTP服务器，请检查服务器地址和端口。")
    except Exception as e:
        print(f"发送邮件时发生未知错误: {e}")
        
    return False

# --- 模块自测试代码 ---
if __name__ == '__main__':
    print("--- 邮件发送模块自测试 ---")
    
    # --- 定义测试邮件的标题和内容 ---
    test_subject = "来自 Python 模块的自测试邮件"
    test_body = f"你好，\n\n这是一封通过 'notifier.py' 模块发送的测试邮件。\n时间：{__import__('datetime').datetime.now()}"

    # --- 调用发送函数 ---
    
    # 方式一：发送给配置文件中的默认收件人
    print("\n--- 测试1：发送给配置文件中的默认收件人 ---")
    send_email(test_subject, test_body)
    
    print("-" * 30)
